import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/reset.css'

import App from './App.vue'
import router from './router'
import { initializeDynamicRoutes } from '@/router/dynamic'

// 全局事件总线
const eventBus = {
  callbacks: {} as Record<string, Function[]>,
  emit(event: string, data?: any) {
    if (this.callbacks[event]) {
      this.callbacks[event].forEach(callback => callback(data))
    }
  },
  on(event: string, callback: Function) {
    if (!this.callbacks[event]) {
      this.callbacks[event] = []
    }
    this.callbacks[event].push(callback)
  }
}

// 将事件总线挂载到全局
;(window as any).eventBus = eventBus

// 应用启动函数
async function bootstrap() {
  console.log('🚀 应用启动中...')
  
  // 创建Vue应用实例
  const app = createApp(App)
  
  // 安装插件
  app.use(createPinia())
  app.use(Antd)
  
  try {
    // 预初始化动态路由 - 在挂载应用前完成
    const result = await initializeDynamicRoutes(router)
    
    // 安装路由 - 在挂载应用前完成
    app.use(router)
    
    // 挂载应用以显示加载界面
    app.mount('#app')
    
    // 等待一下以显示加载动画
    await new Promise(resolve => setTimeout(resolve, 500))
    
    // 更新加载状态
    eventBus.emit('updateLoading', {
      text: '正在检查用户登录状态...',
      status: '验证身份信息',
      progress: 20
    })
    
    await new Promise(resolve => setTimeout(resolve, 300))
    
    // 更新加载状态
    eventBus.emit('updateLoading', {
      text: '正在加载动态路由...',
      status: '获取用户权限数据中',
      progress: 40
    })
    
    await new Promise(resolve => setTimeout(resolve, 300))
    
    if (result.success) {
      eventBus.emit('updateLoading', {
        text: '正在启动应用...',
        status: '路由加载完成',
        progress: 80
      })
    } else {
      eventBus.emit('updateLoading', {
        text: '正在启动应用...',
        status: result.error || '路由加载失败，但应用可继续使用',
        progress: 60
      })
    }
    
    // 等待一下以完成加载动画
    await new Promise(resolve => setTimeout(resolve, 300))
    
    // 完成初始化
    eventBus.emit('updateLoading', {
      text: '启动完成',
      status: '欢迎使用系统',
      progress: 100
    })
    
    // 等待一下再隐藏加载页面
    await new Promise(resolve => setTimeout(resolve, 200))
    
    // 标记应用准备就绪
    eventBus.emit('appReady', true)
    
    console.log('🎉 应用启动完成!')
    
  } catch (error) {
    console.error('💥 应用启动失败:', error)
    
    // 即使失败也要启动应用
    eventBus.emit('updateLoading', {
      text: '启动时出现错误，但应用仍可使用',
      status: '部分功能可能受限',
      progress: 100
    })
    
    // 确保路由已安装
    try {
      app.use(router)
    } catch (routerError) {
      console.error('路由安装失败:', routerError)
    }
    
    // 确保应用已挂载
    try {
      if (!document.getElementById('app')?.hasChildNodes()) {
        app.mount('#app')
      }
    } catch (mountError) {
      console.error('应用挂载失败:', mountError)
    }
    
    // 等待一下
    await new Promise(resolve => setTimeout(resolve, 1000))
    
    // 标记应用准备就绪
    eventBus.emit('appReady', true)
  }
}

// 启动应用
bootstrap().catch(error => {
  console.error('应用启动过程中发生严重错误:', error)
  
  // 降级启动 - 传统方式
  console.log('🔄 尝试降级启动...')
  const app = createApp(App)
  app.use(createPinia())
  app.use(router)
  app.use(Antd)
  app.mount('#app')
})
